﻿Public Class Turno
    Enum estado
        insertar
        modificar
    End Enum
    Enum termino
        aprobado
        rechazado
    End Enum
    
    Dim accion As estado = estado.insertar
    Dim acceso As acceso_a_datos
    Dim idselected As Integer



    Private Sub Turno_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        acceso = New acceso_a_datos()
        acceso._tabla = "Turno"
        bloquear()

        btn_eliminar.Enabled = False
        btn_guardar.Enabled = False

        cargarGrilla()
    End Sub

    Private Sub txt_nombre_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_nombre.KeyPress, txt_descripcion.KeyPress
        Select Case Asc(e.KeyChar)
            Case 4, 24, 4, 19, 127, 13, 9, 15, 14, 8
                Exit Sub
        End Select

        If IsNumeric(e.KeyChar) Then
            MsgBox("Solamente Ingrese Letras", MsgBoxStyle.Information, "Atención")
            e.KeyChar = ""
        End If
    End Sub

    Private Sub txt_hora_desde_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_hora_desde.KeyPress, txt_hora_hasta.KeyPress
        Select Case Asc(e.KeyChar)
            Case 4, 8, 13, 24
                Exit Sub
        End Select

        If Not IsNumeric(e.KeyChar) Then
            MsgBox("Solamente Ingrese Números", MsgBoxStyle.Information, "Atención")
            e.KeyChar = ""
        End If
    End Sub

    Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
        Me.Close()
    End Sub

    Private Sub cargarGrilla()
        Dim tabla = acceso.leo_tabla()
        Dim c As Integer
        acceso._tabla = "Turno"

        grilla_turnos.Rows.Clear()

        For c = 0 To tabla.Rows.Count - 1
            grilla_turnos.Rows.Add(tabla.Rows(c)("cod_Turno"), tabla.Rows(c)("nombre"), tabla.Rows(c)("descripcion"), FormatDateTime(tabla.Rows(c)("hora_Desde"), DateFormat.ShortTime), FormatDateTime(tabla.Rows(c)("hora_Hasta"), DateFormat.ShortTime))
        Next
    End Sub

    Public Sub bloquear()
        txt_descripcion.Enabled = False
        txt_hora_desde.Enabled = False
        txt_hora_hasta.Enabled = False
        txt_nombre.Enabled = False
    End Sub

    Public Sub desbloquear()
        txt_descripcion.Enabled = True
        txt_hora_desde.Enabled = True
        txt_hora_hasta.Enabled = True
        txt_nombre.Enabled = True

        darFoco()
    End Sub

    Public Sub darFoco()

        If txt_nombre.Text = "" Then
            txt_nombre.Focus()
            Exit Sub
        End If
        If txt_descripcion.Text = "" Then
            txt_descripcion.Focus()
            Exit Sub
        End If
        If txt_hora_desde.Text = "" Then
            txt_hora_desde.Focus()
            Exit Sub
        End If
        If txt_hora_hasta.Text = "" Then
            txt_hora_hasta.Focus()
            Exit Sub
        End If

    End Sub

    Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click
        btn_guardar.Enabled = True
        btn_eliminar.Enabled = False

        'borrar una ves entes de implementar
        indicar_obligatorios(sender, e)

        desbloquear()
        limpiarCampos()

        Me.accion = estado.insertar
    End Sub

    Private Sub limpiarCampos()
        txt_nombre.Text = ""
        txt_descripcion.Text = ""
        txt_hora_desde.Text = ""
        txt_hora_hasta.Text = ""
        'lbl_nombre_obligatorio.Visible = False
        'lbl_descripcion_obligatorio.Visible = False
        'lbl_desde_obligatorio.Visible = False
        'lbl_hasta_obligatorio.Visible = False
        darFoco()
    End Sub

    Private Function validarCampos(ByVal sender As System.Object, ByVal e As System.EventArgs) As Boolean
        If txt_nombre.Text = "" Then
            'MessageBox.Show("Debe completar el campo Nombre", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            indicar_obligatorios(sender, e)
            txt_nombre.Focus()
            Return False
        End If
        If txt_descripcion.Text = "" Then
            'MessageBox.Show("Debe completar el campo Descripción", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            indicar_obligatorios(sender, e)
            txt_descripcion.Focus()
            Return False
        End If
        If txt_hora_desde.Text = "  :" Then
            'MessageBox.Show("Debe completar el campo Hora Desde", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            indicar_obligatorios(sender, e)
            txt_hora_desde.Focus()
            Return False
        End If
        Try
            If Not txt_hora_desde.Text = Format(CDate(txt_hora_desde.Text), "HH:mm") Then
                MessageBox.Show("La Hora Desde ingresada es invalida", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
                txt_hora_desde.Text = ""
                txt_hora_desde.Focus()
                Return False
            End If
        Catch ex As Exception
            MessageBox.Show("La Hora Desde ingresada es invalida", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            txt_hora_desde.Text = ""
            txt_hora_desde.Focus()
            Return False
        End Try
        If txt_hora_hasta.Text = "  :" Then
            'MessageBox.Show("Debe completar el campo Hora Hasta", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            indicar_obligatorios(sender, e)
            txt_hora_hasta.Focus()
            Return False

        End If
        Try
            If Not txt_hora_hasta.Text = Format(CDate(txt_hora_hasta.Text), "HH:mm") Then
                MessageBox.Show("La Hora Hasta ingresada es invalida", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
                txt_hora_hasta.Text = ""
                txt_hora_hasta.Focus()
                Return False
            End If
        Catch ex As Exception
            MessageBox.Show("La Hora Hasta ingresada es invalida", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            txt_hora_hasta.Text = ""
            txt_hora_hasta.Focus()
            Return False
        End Try

        If txt_hora_desde.Text = txt_hora_hasta.Text Then
            MessageBox.Show("Las horas no Pueden ser Iguales", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            txt_hora_desde.Text = ""
            txt_hora_hasta.Text = ""
            txt_hora_desde.Focus()
            Return False
        End If
        If txt_hora_desde.Text > txt_hora_hasta.Text Then
            MessageBox.Show("La hora Desde no puede ser Mayor que la hora Hasta", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            txt_hora_desde.Text = ""
            txt_hora_hasta.Text = ""
            txt_hora_desde.Focus()
            Return False
        End If

        Return True
    End Function

    Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click
        If validarCampos(sender, e) = True And accion = estado.insertar Then
            If validarExistencia() = termino.rechazado Then
                MessageBox.Show("Ya esta cargado un Turno con ese Nombre", "Importante", MessageBoxButtons.OK, MessageBoxIcon.Error)
                txt_nombre.Focus()
            Else
                If insertar() = termino.aprobado Then
                    MessageBox.Show("Exito al Grabar en Base de Datos", "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
                    bloquear()
                    limpiarCampos()
                    btn_guardar.Enabled = False
                End If
            End If

        Else
            If validarCampos(sender, e) = True And accion = estado.modificar Then
                If modificar() = termino.aprobado Then
                    MessageBox.Show("Exito al Modificar en Base de Datos", "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
                    bloquear()
                    limpiarCampos()
                    btn_guardar.Enabled = False
                End If

            End If
        End If

        cargarGrilla()
    End Sub

    Private Function validarExistencia() As termino
        acceso._tabla = "Turno"

        Dim tabla = acceso.leo_tabla("nombre = '" & txt_nombre.Text & "'")

        If tabla.Rows.Count = 1 Then
            Return termino.rechazado
        Else
            Return termino.aprobado
        End If

    End Function

    Private Function insertar() As termino
        acceso._tabla = "Turno"
        Dim consulta As String

        consulta = "cod_Turno= " & obtenerId() + 1
        consulta += ", nombre= " & txt_nombre.Text
        consulta += ", hora_Desde= 01/01/1900 " & txt_hora_desde.Text & ""
        consulta += ", hora_Hasta= 01/01/1900 " & txt_hora_hasta.Text & ""
        consulta += ", descripcion= " & txt_descripcion.Text

        Try
            acceso._insertar(consulta)
            Return termino.aprobado
        Catch ex As Exception
            MessageBox.Show("Error al Insertar en la base de datos" & vbCrLf + vbCrLf & "Mensaje de error: " & vbCrLf + ex.Message, "Error al Insertar en la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Return termino.rechazado
        End Try

    End Function

    Public Function obtenerId() As Integer
        acceso._tabla = "Turno"
        Dim tabla

        Try
            tabla = acceso._consulta("select max(cod_Turno) as id from Turno")

            If tabla.Rows.Count = 1 Then
                Return tabla.Rows(0)("id")
            Else
                Return 0
            End If
        Catch ex As InvalidCastException
            Return 0
        End Try
    End Function

    Private Sub grilla_turnos_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grilla_turnos.CellDoubleClick
        acceso._tabla = "Turno"
        limpiarCampos()

        idselected = grilla_turnos.CurrentRow.Cells("id").Value

        Dim tabla = acceso.leo_tabla("cod_Turno = " & idselected)

        desbloquear()

        txt_nombre.Text = tabla.Rows(0)("nombre")
        txt_descripcion.Text = tabla.Rows(0)("descripcion")
        txt_hora_desde.Text = FormatDateTime(tabla.Rows(0)("hora_Desde"), DateFormat.ShortTime)
        txt_hora_hasta.Text = FormatDateTime(tabla.Rows(0)("hora_Hasta"), DateFormat.ShortTime)

        accion = estado.modificar
        btn_guardar.Enabled = True
        btn_eliminar.Enabled = True
    End Sub

    Private Sub btn_eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If txt_nombre.Text = "" And txt_descripcion.Text = "" Then
            MessageBox.Show("Debe seleccionar el turno a eliminar", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        If MessageBox.Show("¿Realmente desea Borrar?", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Cancel Then
            Exit Sub
        End If

        If eliminar() = termino.aprobado Then
            bloquear()
            limpiarCampos()
            cargarGrilla()
            btn_eliminar.Enabled = False
            btn_guardar.Enabled = False
            MessageBox.Show("Exito el Eliminar el Turno", "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
        End If


    End Sub

    Private Function eliminar() As termino
        acceso._tabla = "Turno"
        Dim sentencia As String

        sentencia = "Delete From Turno"
        sentencia += " Where cod_Turno= " & idselected

        Try
            acceso._borrar(sentencia)
            Return termino.aprobado
        Catch ex As Exception
            MessageBox.Show("Error al Eliminar de la base de datos" & vbCrLf + vbCrLf & "Mensaje de error: " & vbCrLf + ex.Message, "Error al Eliminar de la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)

            Return termino.rechazado
        End Try

    End Function

    Private Function modificar() As termino
        acceso._tabla = "Turno"
        Dim sentencia As String

        sentencia = "nombre= " & txt_nombre.Text
        sentencia += ", hora_Desde= 01/01/1900 " & txt_hora_desde.Text & ""
        sentencia += ", hora_hasta= 01/01/1900 " & txt_hora_hasta.Text & ""
        sentencia += ", descripcion= " & txt_descripcion.Text

        Try
            acceso._modificar(sentencia, "cod_Turno = " & idselected)
            Return termino.aprobado
        Catch ex As Exception
            MessageBox.Show("Error al Modificar en la base de datos" & vbCrLf + vbCrLf & "Mensaje de error: " & vbCrLf + ex.Message, "Error al Modificar en la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)

            Return termino.rechazado
        End Try
    End Function

    Private Sub txt_nombre_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_nombre.Leave
        If txt_nombre.Text = "" And btn_salir.Focused = False Then
            lbl_nombre_obligatorio.Visible = True
        Else
            lbl_nombre_obligatorio.Visible = False
        End If
    End Sub

    Private Sub txt_descripcion_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_descripcion.Leave
        If txt_descripcion.Text = "" And btn_salir.Focused = False Then
            lbl_descripcion_obligatorio.Visible = True
        Else
            lbl_descripcion_obligatorio.Visible = False
        End If
    End Sub

    Private Sub txt_hora_desde_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_hora_desde.Leave
        If txt_hora_desde.Text = "  :" And btn_salir.Focused = False Then
            lbl_desde_obligatorio.Visible = True
        Else
            lbl_desde_obligatorio.Visible = False
        End If
    End Sub

    Private Sub txt_hora_hasta_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_hora_hasta.Leave
        If txt_hora_hasta.Text = "  :" And btn_salir.Focused = False Then
            lbl_hasta_obligatorio.Visible = True
        Else
            lbl_hasta_obligatorio.Visible = False
        End If
    End Sub

    'Para que se prendan todas juntas
    Public Sub indicar_obligatorios(ByVal sender As System.Object, ByVal e As System.EventArgs)
        txt_nombre_Leave(sender, e)
        txt_descripcion_Leave(sender, e)
        txt_hora_desde_Leave(sender, e)
        txt_hora_hasta_Leave(sender, e)
    End Sub


    Private Sub Turno_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        Dispose()
    End Sub
End Class